using System;
using System.Data;
using Mono.Data.SqliteClient;
using System.Text;
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Linq;
using System.IO;


namespace csDataRebides
{
	class csDataRebides
	{
		

		
  
	// Este metodo permite chamar os outros metodos criados , para serem executados
	// É criado um objecto para ser possivel criar o o ficheiro txt com nome "Estatisticas.txt"
    public static void Main(string[] args)
    {
		 System.IO.StreamWriter file = new System.IO.StreamWriter("Estatisticas.txt");	
  
	   
	   	  //total de docentes por ano
		    createFileTDA(file);	 
		 //Total de Docentes por estabelecimento por ano
		    createFileTDEA (file);
	    // Total de Docentes por Grau e por Ano 
		    createFileTDGA(file);
	      //Total de Docentes por estabelecimento e por grau e por ano
		    createFileDEGA(file);
		  //total de Docentes Doutorados por estabelcimento e por ano
		    createFileTDDEA ( file);
		//Conjunto dos nomes dos titulares por estabelecimento e por ano
		    createFileCNDDEA (file);
		// Lista dos estabelecimentos por ano
		    createFileListEA(file);
		// Lista dos titulares dos graus por ano
		    createFileListDGA(file);
		 
		//Lista dos docentes que deixaram os estabelecimentos por ano
		    csharp5613.Statistics.listDDEAno(file);
	    //Lista dos Docentes que entraram nos estabelecimentos
		   csharp5613.Statistics.listDEEA(file);
			
		
			
		file.Close();	
			
	}
	
		
	// Este metodo permite escrever o numero total de docentes por ano no ficheiro estatisticas.txt 
	// Recebe como parametro file , para ser possivel guardar dados no txt
	//  O numero total de docentes vai ser chamado a partir do metodo dicTotalDocAno que retorna um dicionário com os dados
	public static void createFileTDA (System.IO.StreamWriter file)
	{
		  
		
		 Dictionary<string, int> dicTDA = csharp5613.Statistics.dicTotalDocAno();	
		 Console.WriteLine("Nota:");	
		 Console.WriteLine("O numero total de docentes por ano foram guardadas no ficheiro Estatisticas.txt");
         file.WriteLine("--------------------------------------------------------");
		 file.WriteLine("Numero Total de Professores no Ensino superior por Ano:");
		 file.WriteLine("");
		 // Escrita no ficheiro txt as estatisticas
			foreach (KeyValuePair<string, int> keyPair in dicTDA)
            {
                //Console.WriteLine(keyPair.Key + keyPair.Value);
                file.WriteLine(keyPair.Key + keyPair.Value);
            }
		 file.WriteLine("");
	}
		
    // Este metodo permite escrever o numero total de docentes por estabelecimento e por ano no ficheiro estatisticas.txt 
	// Recebe como parametro file , para ser possivel guardar dados no txt
	//  O numero total de docentes vai ser chamado a partir do metodo dicTotalDocEstAno que retorna um dicionário com 
	//	outro dicionário com os dados
	public static void createFileTDEA (System.IO.StreamWriter file)
	{
		    
			Dictionary<string, Dictionary<string, int>> dicTDEA = csharp5613.Statistics.dicTotalDocEstAno();
            Console.WriteLine();
            Console.WriteLine("Nota:");	
		 	Console.WriteLine("O numero total de docentes  por estabelecimento e por ano foram guardadas no ficheiro Estatisticas.txt");
         	file.WriteLine("----------------------------------------------------------------");
            file.WriteLine("Numero Total de Professores por estabelecimento e por Ano:");
            
			//Escrita num ficheiro txt as estatisticas
			foreach (KeyValuePair<string, Dictionary<string, int>> keyPair in dicTDEA)
            {
                
                file.WriteLine();
                file.WriteLine("No " + keyPair.Key + ":");
                file.WriteLine();

                Dictionary<string, int> tdea = dicTDEA[keyPair.Key];

                foreach (KeyValuePair<string, int> keyPair2 in tdea)
                {
                    Console.WriteLine(keyPair2.Key + tdea[keyPair2.Key]);
                    file.WriteLine(keyPair2.Key + tdea[keyPair2.Key]);
                }
            }
        
	}
		
	// Este metodo permite escrever o numero total de docentes por grau e por ano no ficheiro estatisticas.txt 
	// Recebe como parametro file , para ser possivel guardar dados no txt
	//  O numero total de docentes vai ser chamado a partir do metodo dicTotalDocGrauAno que retorna um dicionário com 
	//	outro dicionário, com os dados	
	public static void createFileTDGA (System.IO.StreamWriter file)
	{
	   		
			Dictionary<string, Dictionary<string, int>> dicTDGA = csharp5613.Statistics.dicTotalDocGrauAno();
            Console.WriteLine();
            Console.WriteLine("Nota:");	
		 	Console.WriteLine("O numero total de docentes por grau e por ano, foram guardadas no ficheiro Estatisticas.txt");
         	file.WriteLine("----------------------------------------------------------------");
            file.WriteLine("Numero Total de Professores por grau e por Ano:");
            // Escrita no ficheiro txt , as estatisticas
			foreach (KeyValuePair<string, Dictionary<string, int>> keyPair in dicTDGA)
            {
                
                file.WriteLine();
                file.WriteLine("No " + keyPair.Key + ":");
                file.WriteLine();

                Dictionary<string, int> TDGA = dicTDGA[keyPair.Key];

                foreach (KeyValuePair<string, int> keyPair2 in TDGA)
                {
                    Console.WriteLine(keyPair2.Key + TDGA[keyPair2.Key]);
                    file.WriteLine(keyPair2.Key + TDGA[keyPair2.Key]);
                }
            }
    }
		
	// Este metodo permite calcular e guardar num ficheiro .txt o numero total de docentes por grau, 
   // por estabelecimento e por ano. Os dados consultados na base dados , sao enviados para uma lista.
   // A lista tem como parametros <string ,string , int> , foram criados na classe SaveList.
   static void createFileDEGA(System.IO.StreamWriter file)
	{
	   	//Conecção á base de dados
	   	string connectionString = "URI=file:BaseDadosrebides.db,version=3";
       	IDbConnection dbcon;
       	dbcon = (IDbConnection) new SqliteConnection(connectionString);
       	dbcon.Open();
       	IDbCommand dbcmd = dbcon.CreateCommand();
        
        file.WriteLine("----------------------------------------------------------------");
        file.WriteLine("Total de Docentes por grau, por estabelecimento e por ano:");
		Console.WriteLine("Total de Docentes por grau, por estabelecimento e por ano:");		
		List<csharp5613.SaveList> listSave = new List<csharp5613.SaveList>();
			List<csharp5613.SaveList> sortListSave = new List<csharp5613.SaveList>();
			 Dictionary<int, List<csharp5613.SaveList>> finalDic = new Dictionary<int, List<csharp5613.SaveList>>();

     	
		//consulta
		for (int i = 0; i < 1; i++)
        {
			 //Dictionary<string, int> list = new Dictionary<string, int>();	
	         Console.WriteLine("ANO 200{0}", i);
			 string ano = i.ToString();
	         string sql ="SELECT     grau, estabelecimento, COUNT(id)" +
	                     "FROM registo_docentes " +
						 "WHERE registo_docentes.ano = " + ano + " " +
	                     "GROUP BY registo_docentes.grau , registo_docentes.estabelecimento"   ;
	         dbcmd.CommandText = sql;
	         IDataReader reader = dbcmd.ExecuteReader();
			 while (reader.Read())
	         {
			               
	                    string grau = reader.GetString(0);
					    string estabelecimento = reader.GetString(1);
	                    Int32 value = reader.GetInt32(2);
	                   // Console.WriteLine( grau +" - "+ estabelecimento +" - "+ "Total Docentes:" + value);
	                    listSave.Add(new csharp5613.SaveList(estabelecimento,grau,value));
						
	         }
	         reader.Close();
	    	 reader = null;   
		 	 // Faz o sort da lista por ordem ascendente
			 listSave.Sort(delegate(csharp5613.SaveList d1, csharp5613.SaveList d2) { return d1.tDocentes.CompareTo(d2.tDocentes); });
              

        }
       
       Console.WriteLine();
       dbcmd.Dispose();
       dbcmd = null;
       dbcon.Close();
       dbcon = null;
	   
		     //Colocar os dados ordenados no sortList
            foreach (csharp5613.SaveList dados in listSave)
            {
               
				file.WriteLine(dados);
				Console.WriteLine(dados);
            }	
     
      
	   Console.WriteLine("Nota:");	
	   Console.WriteLine("O numero total de docentes por grau, por estabelecimento e por ano, foram guardadas no ficheiro Estatisticas.txt");
   }
	 
	// Este metodo permite escrever no ficheiro num ficheiro txt ,
	// O numero total de docentes no grau Doutoramento por estabelecimento e por ano, foram guardadas no ficheiro Estatisticas.txt
	public static void createFileTDDEA (System.IO.StreamWriter file)
	{
	   		
			Dictionary<string, Dictionary<string, int>> dicTDGA = csharp5613.Statistics.dicTotalDocDoutEstAno("Dou%");
            Console.WriteLine();
            Console.WriteLine("Nota:");	
		 	Console.WriteLine("O numero total de docentes no grau Doutoramento por estabelecimento e por ano, foram guardadas no ficheiro Estatisticas.txt");
         	file.WriteLine("----------------------------------------------------------------");
            file.WriteLine("numero total de docentes no grau Doutoramento por estabelecimento e por ano:");
            // Escrita no ficheiro txt , as estatisticas
			foreach (KeyValuePair<string, Dictionary<string, int>> keyPair in dicTDGA)
            {
                
                file.WriteLine();
                file.WriteLine("No " + keyPair.Key + ":");
                file.WriteLine();

                Dictionary<string, int> TDGA = dicTDGA[keyPair.Key];

                foreach (KeyValuePair<string, int> keyPair2 in TDGA)
                {
                    Console.WriteLine(keyPair2.Key + TDGA[keyPair2.Key]);
                    file.WriteLine(keyPair2.Key + TDGA[keyPair2.Key]);
                }
            }
    }
	// Este metodo permite escrever um ficheiro txt ,
	// Um conjunto dos nomes dos titulares do grau Doutoramento por estabelecimento e por ano
	public static void createFileCNDDEA (System.IO.StreamWriter file)
	{	
		
			Dictionary<string, Dictionary<string, string>> dicTDGA = csharp5613.Statistics.dicNomeDocDoutEstAno("Dou%");
            Console.WriteLine();
            Console.WriteLine("Nota:");	
		 	Console.WriteLine("Conjunto dos nomes dos titulares do grau Doutoramento por estabelecimento e por ano, foram guardadas no ficheiro Estatisticas.txt");
         	file.WriteLine("----------------------------------------------------------------");
            file.WriteLine("Conjunto dos nomes dos titulares do grau Doutoramento por estabelecimento e por ano:");
            // Escrita no ficheiro txt , as estatisticas
			foreach (KeyValuePair<string, Dictionary<string, string>> keyPair in dicTDGA)
            {
                
                file.WriteLine();
                file.WriteLine("No " + keyPair.Key + ":");
                file.WriteLine();

                Dictionary<string, string> TDGA = dicTDGA[keyPair.Key];

                foreach (KeyValuePair<string, string> keyPair2 in TDGA)
                {
                    Console.WriteLine(keyPair2.Key + TDGA[keyPair2.Key]);
                    file.WriteLine(keyPair2.Key + TDGA[keyPair2.Key]);
                }
            }	
			
			
			
	}	
	// Este metodo permite criar uma lista e escrever num ficheiro txt , os estabelecimentos por ano
	// Recebe como parametro file , para ser possivel guardar dados no txt
	public static void createFileListEA (System.IO.StreamWriter file)
	{
		
		 Dictionary <string, List<string>> listEA = csharp5613.Statistics.listEstabAno();	
		 Console.WriteLine("Nota:");	
		 Console.WriteLine("As Listas foram guardadas no ficheiro Estatisticas.txt");
         file.WriteLine("Listas de Estabelecimentos por Ano:");
		 file.WriteLine("");
		 // Escrita no ficheiro txt , os estabelecimentos por ano
			foreach (KeyValuePair<string, List<string>> keyPair in listEA)
            {
                List<string> listEstabAno = keyPair.Value;
               // Console.WriteLine(keyPair.Key);
                file.WriteLine();
                file.WriteLine( keyPair.Key);
                file.WriteLine();

                foreach (string estabelecimento in listEstabAno )
                {
                    
                    file.WriteLine(estabelecimento);
                }

            }
		  file.WriteLine("");	
	}		
	
	// Este metodo permite fazer uma lista dos de titulares de um grau por ano	
	//Recebe como parametro file , para ser possivel guardar dados no txt	
	public static void createFileListDGA (System.IO.StreamWriter file)
	{
	
		 csDataRebides csDR = new csDataRebides();	
		 Dictionary <string, List<string>> listDGA = csharp5613.Statistics.listDocGrauAno();	
		 Console.WriteLine("Nota:");	
		 Console.WriteLine("As Listas foram guardadas no ficheiro Estatisticas.txt");
         file.WriteLine("Listas de professores no Grau Mestrado no Ano:");
		 file.WriteLine("");
		
			foreach (KeyValuePair<string, List<string>> keyPair in listDGA)
            {
                List<string> listDocAno = keyPair.Value;
               // Console.WriteLine(keyPair.Key);
                file.WriteLine();
                file.WriteLine( keyPair.Key);
                file.WriteLine();

                foreach (string docentes in listDocAno )
                {
                    //Console.WriteLine(docentes);
                    file.WriteLine(docentes);
                }

            }
	     	file.WriteLine("");	
			
	}		
			
	
	
	
	
	}
}

